GdkDisplay *display;
GdkDeviceManager *device_manager;
+ GdkDevice *master_pointer;
+ GdkDevice *master_keyboard;
GdkDevice *pointer;
GdkDevice *keyboard;
GdkCursor *cursor;
event = gdk_event_new (GDK_ENTER_NOTIFY);
event->crossing.window = g_object_ref (device->pointer_focus);
- gdk_event_set_device (event, device->pointer);
+ gdk_event_set_device (event, device->master_pointer);
+ gdk_event_set_source_device (event, device->pointer);
event->crossing.subwindow = NULL;
event->crossing.time = (guint32)(g_get_monotonic_time () / 1000);
event->crossing.mode = GDK_CROSSING_NORMAL;
event = gdk_event_new (GDK_LEAVE_NOTIFY);
event->crossing.window = g_object_ref (device->pointer_focus);
- gdk_event_set_device (event, device->pointer);
+ gdk_event_set_device (event, device->master_pointer);
+ gdk_event_set_source_device (event, device->pointer);
event->crossing.subwindow = NULL;
event->crossing.time = (guint32)(g_get_monotonic_time () / 1000);
event->crossing.mode = GDK_CROSSING_NORMAL;
event->motion.type = GDK_MOTION_NOTIFY;
event->motion.window = g_object_ref (device->pointer_focus);
- gdk_event_set_device (event, device->pointer);
+ gdk_event_set_device (event, device->master_pointer);
+ gdk_event_set_source_device (event, device->pointer);
event->motion.time = time;
event->motion.axes = NULL;
event->motion.state = device->modifiers;
event = gdk_event_new (state ? GDK_BUTTON_PRESS : GDK_BUTTON_RELEASE);
event->button.window = g_object_ref (device->pointer_focus);
- gdk_event_set_device (event, device->pointer);
+ gdk_event_set_device (event, device->master_pointer);
+ gdk_event_set_source_device (event, device->pointer);
event->button.time = time;
event->button.axes = NULL;
event->button.state = device->modifiers;
device->time = time;
event = gdk_event_new (GDK_SCROLL);
event->scroll.window = g_object_ref (device->pointer_focus);
- gdk_event_set_device (event, device->pointer);
+ gdk_event_set_device (event, device->master_pointer);
+ gdk_event_set_source_device (event, device->pointer);
event->scroll.time = time;
event->scroll.direction = GDK_SCROLL_SMOOTH;
event->scroll.delta_x = delta_x;
event->focus_change.window = g_object_ref (device->keyboard_focus);
event->focus_change.send_event = FALSE;
event->focus_change.in = TRUE;
- gdk_event_set_device (event, device->keyboard);
+ gdk_event_set_device (event, device->master_keyboard);
+ gdk_event_set_source_device (event, device->keyboard);
GDK_NOTE (EVENTS,
g_message ("focus int, device %p surface %p",
event->focus_change.window = g_object_ref (device->keyboard_focus);
event->focus_change.send_event = FALSE;
event->focus_change.in = FALSE;
- gdk_event_set_device (event, device->keyboard);
+ gdk_event_set_device (event, device->master_keyboard);
+ gdk_event_set_source_device (event, device->keyboard);
g_object_unref(device->keyboard_focus);
device->keyboard_focus = NULL;
event = gdk_event_new (state ? GDK_KEY_PRESS : GDK_KEY_RELEASE);
event->key.window = device->keyboard_focus ? g_object_ref (device->keyboard_focus) : NULL;
- gdk_event_set_device (event, device->keyboard);
+ gdk_event_set_device (event, device->master_keyboard);
+ gdk_event_set_source_device (event, device->keyboard);
event->button.time = time_;
event->key.state = device->modifiers;
event->key.group = 0;
wl_pointer_add_listener (device->wl_pointer, &pointer_listener, device);
device->pointer = g_object_new (GDK_TYPE_WAYLAND_DEVICE,
- "name", "Core Pointer",
- "type", GDK_DEVICE_TYPE_MASTER,
+ "name", "Wayland Pointer",
+ "type", GDK_DEVICE_TYPE_SLAVE,
"input-source", GDK_SOURCE_MOUSE,
"input-mode", GDK_MODE_SCREEN,
"has-cursor", TRUE,
"display", device->display,
"device-manager", device->device_manager,
NULL);
+ _gdk_device_set_associated_device (device->pointer, device->master_pointer);
GDK_WAYLAND_DEVICE (device->pointer)->device = device;
device_manager->devices =
{
wl_pointer_destroy (device->wl_pointer);
device->wl_pointer = NULL;
+ _gdk_device_set_associated_device (device->pointer, NULL);
device_manager->devices =
g_list_remove (device_manager->devices, device->pointer);
wl_keyboard_add_listener (device->wl_keyboard, &keyboard_listener, device);
device->keyboard = g_object_new (GDK_TYPE_WAYLAND_DEVICE,
- "name", "Core Keyboard",
- "type", GDK_DEVICE_TYPE_MASTER,
+ "name", "Wayland Keyboard",
+ "type", GDK_DEVICE_TYPE_SLAVE,
"input-source", GDK_SOURCE_KEYBOARD,
"input-mode", GDK_MODE_SCREEN,
"has-cursor", FALSE,
"display", device->display,
"device-manager", device->device_manager,
NULL);
+ _gdk_device_set_associated_device (device->keyboard, device->master_keyboard);
GDK_WAYLAND_DEVICE (device->keyboard)->device = device;
device_manager->devices =
{
wl_keyboard_destroy (device->wl_keyboard);
device->wl_keyboard = NULL;
+ _gdk_device_set_associated_device (device->keyboard, NULL);
device_manager->devices =
g_list_remove (device_manager->devices, device->keyboard);
g_object_unref (device->keyboard);
device->keyboard = NULL;
}
-
- if (device->keyboard && device->pointer)
- {
- _gdk_device_set_associated_device (device->pointer, device->keyboard);
- _gdk_device_set_associated_device (device->keyboard, device->pointer);
- }
}
static const struct wl_seat_listener seat_listener = {
}
}
+static void
+init_devices (GdkWaylandDeviceData *device)
+{
+ GdkWaylandDeviceManager *device_manager =
+ GDK_WAYLAND_DEVICE_MANAGER (device->device_manager);
+
+ /* pointer */
+ device->master_pointer = g_object_new (GDK_TYPE_WAYLAND_DEVICE,
+ "name", "Core Pointer",
+ "type", GDK_DEVICE_TYPE_MASTER,
+ "input-source", GDK_SOURCE_MOUSE,
+ "input-mode", GDK_MODE_SCREEN,
+ "has-cursor", TRUE,
+ "display", device->display,
+ "device-manager", device_manager,
+ NULL);
+ GDK_WAYLAND_DEVICE (device->master_pointer)->device = device;
+
+ device_manager->devices =
+ g_list_prepend (device_manager->devices, device->master_pointer);
+ g_signal_emit_by_name (device_manager, "device-added", device->master_pointer);
+
+ /* keyboard */
+ device->master_keyboard = g_object_new (GDK_TYPE_WAYLAND_DEVICE,
+ "name", "Core Keyboard",
+ "type", GDK_DEVICE_TYPE_MASTER,
+ "input-source", GDK_SOURCE_KEYBOARD,
+ "input-mode", GDK_MODE_SCREEN,
+ "has-cursor", FALSE,
+ "display", device->display,
+ "device-manager", device_manager,
+ NULL);
+ GDK_WAYLAND_DEVICE (device->master_keyboard)->device = device;
+
+ device_manager->devices =
+ g_list_prepend (device_manager->devices, device->master_keyboard);
+ g_signal_emit_by_name (device_manager, "device-added", device->master_keyboard);
+
+ /* link both */
+ _gdk_device_set_associated_device (device->master_pointer, device->master_keyboard);
+ _gdk_device_set_associated_device (device->master_keyboard, device->master_pointer);
+}
+
void
_gdk_wayland_device_manager_add_seat (GdkDeviceManager *device_manager,
guint32 id,
device->pointer_surface =
wl_compositor_create_surface (display_wayland->compositor);
+ init_devices (device);
init_settings (device);
}
GdkDeviceType type)
{
GdkWaylandDeviceManager *wayland_device_manager;
- GList *devices = NULL;
+ GList *devices = NULL, *l;
+
+ wayland_device_manager = (GdkWaylandDeviceManager *) device_manager;
- if (type == GDK_DEVICE_TYPE_MASTER)
+ for (l = wayland_device_manager->devices; l; l = l->next)
{
- wayland_device_manager = (GdkWaylandDeviceManager *) device_manager;
- devices = g_list_copy (wayland_device_manager->devices);
+ if (gdk_device_get_device_type (l->data) == type)
+ devices = g_list_prepend (devices, l->data);
}
return devices;